package com.springboot.controller;

import com.springboot.entity.Employee;
import org.springframework.web.bind.annotation.*;

import java.util.*;

/**
 * 什么是 REST:
 * REST不是一种新技术，而是一种约束、一种设计API的编码风格规范，它规范的是后端接口编写的逻辑，编写的规范动作。
 * 因为后端开发人员很多，所以规范是必须有的，而这种规范就是REST。它最常用的数据格式是使用JSON作为返回值。
 * REST对接口的定义做了规范，跟着规范走来开发的应用程序或设计就是就属于RESTful应用。
 * 这套风格最主要的意义是为了适应应用互联网时代的多个客户端都能访问页面这个问题，多个客户端基于相同的协议来调用该API接口即可获取相同数据，
 * 这也是为什么要用json作为返回值的原因。
 * <p>
 * 传统的请求映射与 RESTful 的区别:
 * (1)传统的请求映射方法（接口）设计考虑要点:
 * 1> 请求路径：/employee/save
 * 2> 请求方式：get/post
 * 3> 请求参数:employee对象  角色id集合
 * 4> 请求响应值：JsonResult对象
 * (2)RESTful风格接口约束要点:
 * 1> 请求路径：要求是操作资源（实体对象：domain）名称复数 /emplyees（就是写domain作为请求路径且+s,
 * 2> 请求方式：使用请求方式替换资源操作：POST-新增 GET-查询 DELETE-删除 PUT-更新
 * 3> 请求参数：跟之前一样，需求决定：employee对象  角色id集合
 * 4> 请求响应值：跟之前一样，需求决定，但是要求返回值都是json格式（全部换成json返回，不再像以前那样返回页面）
 * <p>
 * 前言：此处编写请求映射方法的行为就是大众意义上的常说的编写接口-也即是API
 * 本控制器采用Restful风格来编写
 * 本控制器使用了"组合注解"来简化开发
 * TIPS：组合注解：其实就是一个注解却拥有了很多种注解的功能，可直接代替使用
 *
 * @author yexi
 */
@RestController//相当于@ResponseBody+@Controller,因此@Controller和@ResponseBody就不用贴了
@RequestMapping("employees")
public class EmployeeRestfulController {

    /**
     * Restful风格：
     *  特征：1>请求路径：确定接口操作资源名，命名为 /资源名s 就比如/employees
     *       2>请求方式：请求必须明确指定请求方式(get是查询、post是添加、delete是删除、put是更新)
     *       3>请求参数：需求决定
     *       4>请求返回值：需求决定，一般返回结果使用json格式(其实这段是违背Restful的了，因为Restful是希望弄死的返回规则，但我们没必要)
     */

    @GetMapping
    //相当于@RequestMapping(method = RequestMethod.GET),组合注解代替使用，后面同理
    /*@RequestMapping(method = RequestMethod.GET)*/
    public List<Employee> list() {
        return Arrays.asList(new Employee(1L, "sa", 12),
                new Employee(2L, "sa", 12));
    }

    /*    @RequestMapping(method = RequestMethod.POST)*/
    //路径可以一样,但是方法不能一样,映射路径都能是/employees,但是后面必须不一样(指的是上面这个@RequestMapping的内部不能一样)
    @PostMapping
    public Employee save(Employee employee) {
        employee.setId(1L);
        employee.setDate(new Date());
        return employee;
    }

    @PutMapping
    public Employee update(Employee employee) {
        employee.setName("asd");
        return employee;
    }

    @DeleteMapping
    public Map<String, Object> delete(Long id) {
        //此处是模拟返回JsonResult对象的情况，id则是模拟要返回数据的情况
        HashMap<String, Object> map = new HashMap<>();
        map.put("删除成功", id++);
        map.put("删除又失败了", id++);
        map.put("删除又成功了", id++);
        map.put("结果又失败了", id++);
        map.put("结果又成功了", id++);
        map.put("之后还是失败了", ++id);
        return map;
    }

    /*    @RequestMapping(value = "/{id}", method = RequestMethod.GET)*/
    @GetMapping("{id}")
    public Employee list(@PathVariable Long id) {
        return new Employee(id, "sa", 12);
    }

}
